#include "menu.h"
#include "ui_menu.h"
#include <QTimer>
#include <QDateTime>
#include <QDebug>
#include <QHeaderView>
#include <QMessageBox>
#include <QSqlQuery>
#include <QShortcut>

//构造函数
menu::menu(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::menu)
{
    ui->setupUi(this);
    ui_init();

    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 初始化数据库连接
    db_incar = QSqlDatabase::addDatabase("QSQLITE", "incar_connection");
    db_incar.setDatabaseName("car.db");
    if (db_incar.open()) {
        query_incar = QSqlQuery(db_incar);  // 绑定到指定连接
    }

    db_totalcar = QSqlDatabase::addDatabase("QSQLITE", "totalcar_connection");
    db_totalcar.setDatabaseName("car.db");
    if (db_totalcar.open()) {
        query_totalcar = QSqlQuery(db_totalcar);  // 绑定到指定连接
    }

    data1base();
    data1base2();
    connect(ui->search_edit,&QLineEdit::textChanged,this,&menu::auto_up);
    connect(&p,SIGNAL(send(int,QString, QString, QString, QString, int,QString,QString)),
            this,SLOT(get_mes(int,QString, QString, QString, QString, int,QString,QString)));

    // 创建F5快捷键，绑定到当前窗口
    QShortcut *f5Shortcut = new QShortcut(QKeySequence(Qt::Key_F5), this);

    // 连接快捷键激活信号到处理函数
    connect(f5Shortcut, &QShortcut::activated, this, &menu::onF5Pressed);

    //定时器更新在场时间
    timer1 = new QTimer(this);
    connect(timer1, SIGNAL(timeout()), this, SLOT(stay_time()));
    timer1->start(30000);

    connect(ui->lineEdit, &QLineEdit::returnPressed, this, &menu::updateTableWidget);
}

//析构函数
menu::~menu()
{
    delete ui;
    delete timer;
    delete timer1;
    delete local;
    QSqlDatabase::removeDatabase("incar_connection");
    QSqlDatabase::removeDatabase("totalcar_connection");
}

//============自动大写===========
void menu::auto_up()
{

    QString text = ui->search_edit->text();
    if(text.contains(QRegExp("[a-z]")))
    {
        ui->search_edit->setText(text.toUpper());
    }
}

//============搜索框放置角落===========
void menu::ui_init()
{
    //设置标签时间
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);

    ui->conner->setParent(ui->tabWidget);
    //设置标签页角落放置按钮
    ui->tabWidget->setCornerWidget(ui->conner, Qt::TopRightCorner);
}

//=============更新时间表===========
void menu::update()
{
    local = new QDateTime(QDateTime::currentDateTime());
    QString t = local->toString("HH:mm:ss");
     ui->time_lb->setText(t);
     delete  local;
}

/*=======================================================================================================================
                                         数据库1(场内车辆)
=========================================================================================================================*/

//链接数据库并初始化表格
void menu::data1base()
{
    if(db_incar.open())
    {
        qDebug() << "数据库1打开成功" ;
    }
    else
    {
        qDebug() << "数据库1打开失败" ;
    }

    //获取incar数据表
    qs=db_incar.record("incar");

    // 筛选目标字段（排除“图片”数据）
    QStringList targetFields; // 存储需要显示的字段名（不含“图片”）
    for (int i = 0; i < qs.count(); i++) {
        QString fieldName = qs.fieldName(i);
        if (fieldName != "图片") {
            targetFields << fieldName;   // 排除“图片”数据
        }
    }

    // 初始化表格列
    ui->in_table->setColumnCount(targetFields.size());
    ui->in_table->setHorizontalHeaderLabels(targetFields);
    ui->in_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 列宽自适应

    //  执行查询
        QString selectSql = "SELECT " + targetFields.join(", ") + " FROM incar ORDER BY 进场时间 DESC;"; // 倒序  拼接SQL：SELECT 车牌,卡号,进场时间,停车时长 FROM incar;
        // 检查查询是否成功
        if (!query_incar.exec(selectSql)) {
            qDebug() << "1查询失败";
            return;
        }

     //  动态设置表格 行数 = 查询结果的记录数
        int rowCount = 0;
        QList<QList<QString>> tableData; // 临时存储所有记录数据
        while (query_incar.next()) { // 遍历查询结果，收集所有数据
           QList<QString> rowData;
               for (int i = 0; i < targetFields.size(); i++) {
                    rowData << query_incar.value(i).toString(); // 读取当前记录的第i个字段值
                }
                tableData << rowData;
                rowCount++;
            }
         ui->in_table->setRowCount(rowCount); // 动态设置行数

      //  将数据填入表格
           for (int row = 0; row < rowCount; row++) {
             QList<QString> rowData = tableData[row];
               for (int col = 0; col < targetFields.size(); col++) {
                   QTableWidgetItem *item = new QTableWidgetItem(rowData[col]);
                   item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // 文本居中
                   ui->in_table->setItem(row, col, item);
                 }
             }

     // 获取水平标题头
        QHeaderView *horizontalHeader = ui->in_table->horizontalHeader();
     // 获取垂直标题头
        QHeaderView *verticalHeader = ui->in_table->verticalHeader();

     // 设置水平标题头样式
        horizontalHeader->setStyleSheet(R"(
                QHeaderView {
                    font-family: "微软雅黑"; /* 字体类型 */
                    font-size: 12pt;        /* 字体大小，pt单位更适配不同DPI */
                    color: #333333;         /* 字体颜色 */
                    background-color: #f0f0f0; /* 背景色 */
                }
                QHeaderView::section {
                    border: 1px solid #cccccc; /* 列边框 */
                    padding: 5px;            /* 内边距，让文字不拥挤 */
                }
            )");

            // 设置垂直标题头样式（行号，若不需要可省略）
            verticalHeader->setStyleSheet(R"(
                QHeaderView {
                    font-family: "微软雅黑";
                    font-size: 10pt;
                    color: #666666;
                    background-color: #f5f5f5;
                }
                QHeaderView::section {
                    border: 1px solid #eeeeee;
                    padding: 3px;
                }
            )");

            // 可选：设置表格内容的字体（保持与标题头风格统一）
            ui->in_table->setStyleSheet(R"(
                QTableWidget {
                    font-family: "微软雅黑";
                    font-size: 10pt;
                    color: #333333;
                }
            )");
}

//更新在场时间
void menu::stay_time()
{
    // 检查数据库是否打开
        if (!db_incar.isOpen()) {
            qDebug() << "数据库未打开，无法更新停车时长";
            return;
        }

        // 获取当前本地时间
        QDateTime currentTime = QDateTime::currentDateTime();
        QString timeFormat = "yyyy年M月d日 HH:mm:ss";

        // 查询所有车辆的车牌和进场时间
        QSqlQuery query(db_incar);
        QString selectSql = "SELECT 车牌, 进场时间 FROM incar";
        if (!query.exec(selectSql)) {
            qDebug() << "2查询车辆信息失败" ;
            return;
        }

        // 遍历每条记录计算并更新停车时长
        while (query.next()) {
            QString carPlate = query.value(0).toString(); // 车牌
            QString enterTimeStr = query.value(1).toString(); // 进场时间

            // 转换进场时间为QDateTime对象
            QDateTime enterTime = QDateTime::fromString(enterTimeStr, timeFormat);
            if (!enterTime.isValid()) {
                qDebug() << "车牌为" << carPlate << "的进场时间格式错误：" << enterTimeStr;
                continue;
            }

            // 计算时间差（分钟）
            qint64 secondsDiff = enterTime.secsTo(currentTime);
            int minutes = qRound(secondsDiff / 60.0); // 转换为分钟并四舍五入
            QString parkTime = QString::number(minutes);

            // 更新数据库中的停车时长
            QSqlQuery updateQuery(db_incar);
            QString updateSql = "UPDATE incar SET 停车时长 = :parkTime WHERE 车牌 = :carPlate";
            updateQuery.prepare(updateSql);
            updateQuery.bindValue(":parkTime", parkTime);
            updateQuery.bindValue(":carPlate", carPlate);

            if (!updateQuery.exec()) {
                qDebug() << "更新车牌为" << carPlate << "的停车时长失败" ;
            } else {
                qDebug() << "更新车牌为" << carPlate << "的停车时长成功，当前时长：" << minutes << "分钟";
            }
        }

        // 刷新表格显示最新的停车时长
        refreshInTable();

}

//刷新表格数据
void menu::refreshInTable()
{
    // 1. 检查数据库连接
    if (!db_incar.isOpen()) {
        qDebug() << "数据库未连接，刷新失败！";
        return;
    }

    // 2. 筛选目标字段
    QSqlRecord record = db_incar.record("incar");
    QStringList targetFields;
    for (int i = 0; i < record.count(); i++) {
        QString fieldName = record.fieldName(i);
        if (fieldName != "图片") {
            targetFields << fieldName;
        }
    }

    // 3. 初始化表格列
    ui->in_table->setColumnCount(targetFields.size());
    ui->in_table->setHorizontalHeaderLabels(targetFields);
    ui->in_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    // 4. 执行查询
    QString selectSql = "SELECT " + targetFields.join(", ") + " FROM incar ORDER BY 进场时间 DESC;"; // 倒序
    if (!query_incar.exec(selectSql)) {
        qDebug() << "查询失败：";
        return;
    }

    // 5. 动态设置行数并收集数据
    int rowCount = 0;
    QList<QList<QString>> tableData;
    while (query_incar.next()) {
        QList<QString> rowData;
        for (int i = 0; i < targetFields.size(); i++) {
            rowData << query_incar.value(i).toString();
        }
        tableData << rowData;
        rowCount++;
    }
    ui->in_table->setRowCount(rowCount);

    int row;
    // 6. 填充表格数据
    for (row = 0; row < rowCount; row++) {
        QList<QString> rowData = tableData[row];
        for (int col = 0; col < targetFields.size(); col++) {
            QTableWidgetItem *item = new QTableWidgetItem(rowData[col]);
            item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
            ui->in_table->setItem(row, col, item);
        }   
    }
    //当前车库数量
    current_num=row;
}

/*=======================================================================================================================
                                         数据库2(历史车辆)
=========================================================================================================================*/

//链接数据库并初始化表格
void menu::data1base2()
{

    if(!db_totalcar.isOpen()) {
        if (!db_totalcar.open()) {
            qDebug() << "totalcar数据库打开失败" ;
            return;
        }
        qDebug() << "totalcar数据库打开成功";
    }

        // 获取totalcar表结构
        qs2 = db_totalcar.record("totalcar");

        // 筛选目标字段（排除“停车时长”和“图片”字段）
        QStringList targetFields;
        for (int i = 0; i < qs2.count(); i++)
        {
            QString fieldName = qs2.fieldName(i);
            if (fieldName != "停车时长" && fieldName != "图片" && fieldName != "进场时间")
            {
                targetFields << fieldName;
            }
        }

        // 初始化total_table表格列
        ui->total_table->setColumnCount(targetFields.size());
        ui->total_table->setHorizontalHeaderLabels(targetFields);
        ui->total_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

        // 执行查询（只查目标字段）
        QString selectSql = "SELECT " + targetFields.join(", ") + " FROM totalcar ORDER BY 时间 DESC;";
        if (!query_totalcar.exec(selectSql))
        {
            qDebug() << "3totalcar查询失败" ;
            return;
        }

        // 收集表格数据
        int rowCount = 0;
        QList<QList<QString>> tableData;
        while (query_totalcar.next())
        {
            QList<QString> rowData;
            for (int i = 0; i < targetFields.size(); i++)
            {
                rowData << query_totalcar.value(i).toString();
            }
            tableData << rowData;
            rowCount++;
        }
        ui->total_table->setRowCount(rowCount);

        // 填充表格数据
        for (int row = 0; row < rowCount; row++)
        {
            QList<QString> rowData = tableData[row];
            for (int col = 0; col < targetFields.size(); col++)
            {
                QTableWidgetItem *item = new QTableWidgetItem(rowData[col]);
                item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                ui->total_table->setItem(row, col, item);
            }
        }

        // 设置表格样式
        QHeaderView *horizontalHeader = ui->total_table->horizontalHeader();
        QHeaderView *verticalHeader = ui->total_table->verticalHeader();

        horizontalHeader->setStyleSheet(R"(
            QHeaderView {
                font-family: "微软雅黑";
                font-size: 12pt;
                color: #333333;
                background-color: #f0f0f0;
            }
            QHeaderView::section {
                border: 1px solid #cccccc;
                padding: 5px;
            }
        )");

        verticalHeader->setStyleSheet(R"(
            QHeaderView {
                font-family: "微软雅黑";
                font-size: 10pt;
                color: #666666;
                background-color: #f5f5f5;
            }
            QHeaderView::section {
                border: 1px solid #eeeeee;
                padding: 3px;
            }
        )");

        ui->total_table->setStyleSheet(R"(
            QTableWidget {
                font-family: "微软雅黑";
                font-size: 10pt;
                color: #333333;
            }
        )");
}

// 刷新total_table表格数据
void menu::refreshTotalTable()
{
    // 检查数据库连接状态
    if (!db_totalcar.isOpen()) {
        if (!db_totalcar.open()) {
            qDebug() << "刷新失败：totalcar数据库连接失败";
            return;
        }
    }

    // 获取totalcar表结构并筛选显示字段（排除停车时长和图片）
    QSqlRecord record = db_totalcar.record("totalcar");
    QStringList targetFields;
    for (int i = 0; i < record.count(); i++) {
        QString fieldName = record.fieldName(i);
        if (fieldName != "停车时长" && fieldName != "图片" && fieldName != "进场时间") {
            targetFields << fieldName;
        }
    }

    // 清空现有表格数据并重新设置列数
    ui->total_table->clearContents();
    ui->total_table->setColumnCount(targetFields.size());
    ui->total_table->setHorizontalHeaderLabels(targetFields);
    ui->total_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    // 执行查询（按时间倒序）
    QString selectSql = "SELECT " + targetFields.join(", ") + " FROM totalcar ORDER BY 时间 DESC;";
    if (!query_totalcar.exec(selectSql)) {
        qDebug() << "刷新查询失败" ;
        return;
    }

    // 收集并填充数据
    int rowCount = 0;
    QList<QList<QString>> tableData;
    while (query_totalcar.next()) {
        QList<QString> rowData;
        for (int i = 0; i < targetFields.size(); i++) {
            rowData << query_totalcar.value(i).toString();
        }
        tableData << rowData;
        rowCount++;
    }
    ui->total_table->setRowCount(rowCount);

    // 填充表格内容
    for (int row = 0; row < rowCount; row++) {
        QList<QString> rowData = tableData[row];
        for (int col = 0; col < targetFields.size(); col++) {
            QTableWidgetItem *item = new QTableWidgetItem(rowData[col]);
            item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
            ui->total_table->setItem(row, col, item);
        }
    }
}

//双击历史记录查看详细信息
void menu::on_total_table_cellDoubleClicked(int row)
{

    QTableWidgetItem *item = ui->total_table->item(row, 3);

    QString time = item->text();

    // 定义变量存储结果
    QString status, car_id, card_id, in_time, out_time;
    QByteArray datagram;
    int fee = 0;

    // 准备查询语句，根据时间查询totalcar表的所有字段
    QSqlQuery query(db_totalcar);
    query.prepare("SELECT 状态, 车牌, 卡号, 进场时间, 时间, 费用, 图片 FROM totalcar WHERE 时间 = :time");
    query.bindValue(":time", time);

    if (query.exec()) {
        if (query.next()) { // 找到匹配的记录
            // 提取各字段数据（注意字段名要与数据库表中一致）
            status = query.value("状态").toString();
            car_id = query.value("车牌").toString();
            card_id = query.value("卡号").toString();
            in_time = query.value("进场时间").toString();
            out_time = query.value("时间").toString();
            datagram = query.value("图片").toByteArray();
            fee = query.value("费用").toInt();

        if(status == "在场")
        {
            p.add_mes(1,car_id,card_id,in_time,out_time,fee,datagram);
        }
        else
        {
            p.add_mes(2,car_id,card_id,in_time,out_time,fee,datagram);
        }

        } else {
            qDebug() << "未找到时间为" << time << "的记录";
        }
    } else {
        qDebug() << "查询失败";
    }

    p.show();
}

//更改与删除
void menu::get_mes(int index,QString car_id, QString card_id, QString in_time, QString out_time, int fee,QString old_in_time,QString old_out_time)
{
    //更改
    if(index == 1)
    {
        QString change_mes;
        if(out_time==NULL)
        {
            change_mes = QString("update totalcar set 车牌='%1',卡号='%2',时间='%3',进场时间='%4',费用='%5' where 进场时间='%6' AND 时间='%7';")
                    .arg(car_id).arg(card_id).arg(in_time).arg(in_time).arg(fee).arg(old_in_time).arg(old_out_time);
        }
        else
        {
            change_mes = QString("update totalcar set 车牌='%1',卡号='%2',时间='%3',进场时间='%4',费用='%5' where 进场时间='%6' AND 时间='%7';")
                    .arg(car_id).arg(card_id).arg(out_time).arg(in_time).arg(fee).arg(old_in_time).arg(old_out_time);
        }
        if (!query_totalcar.exec(change_mes)) {
            qDebug() << "5数据修改失败:" ;
        } else {

            QString mes=QString("select * from incar where 进场时间 ='%1';").arg(old_in_time);
            if (query_incar.exec(mes)) {  // 执行查询并检查是否成功
                  if (query_incar.next()) {  // 判断是否有记录
                      QString mes2=QString("update incar set 车牌='%1',卡号='%2',进场时间='%3' where 进场时间='%4';")
                              .arg(car_id).arg(card_id).arg(in_time).arg(old_in_time);
                      query_incar.exec(mes2);
                  }
            }
            stay_time();
            refreshInTable();
            refreshTotalTable();
            p.hide();
            qDebug() << "数据修改成功";
        }
    }
    //删除
    if(index == 2)
    {
        QString del_mes = QString("delete from totalcar where 进场时间='%1' AND 时间='%2';").arg(old_in_time).arg(old_out_time);

        QString mes=QString("select * from incar where 进场时间 ='%1';").arg(old_in_time);
        if (query_incar.exec(mes)) {  // 执行查询并检查是否成功
              if (query_incar.next()) {  // 判断是否有记录
                  QString mes2=QString("delete from incar where 进场时间='%1';").arg(old_in_time);
                  query_incar.exec(mes2);
              }
          }

        if (!query_totalcar.exec(del_mes)) {
            qDebug() << "6数据删除失败:";
        } else {
            refreshInTable();
            refreshTotalTable();
            p.hide();
            qDebug() << "数据删除成功";
        }
    }
}

/*=======================================================================================================================
                                         屏幕一调用接口
=========================================================================================================================*/

//删除项
void menu::del(QString id)
{
    QString del_text = QString("delete from incar where 车牌='%1';").arg(id);
    if (!query_incar.exec(del_text)) {
        qDebug() << "删除失败:";
    } else {
        refreshInTable();
        qDebug() << "删除成功";
    }
}

//添加卡号
void menu::record_card(QString card)
{
    QString mes=QString("select * from card where 卡号='%1';").arg(card);
    if (query_incar.exec(mes)) {  // 执行查询并检查是否成功
          if (!query_incar.next()) {  // 判断是否有记录
              QString mes2=QString("insert into card(卡号) values('%1');").arg(card);  //若卡号不存在则添加该卡号
              query_incar.exec(mes2);
          }
      }
}

//扣除费用
void menu::record_fee(QString card,int fee)
{
    QSqlQuery query(db_incar);
    query.prepare("UPDATE card SET 余额 = 余额 - :fee WHERE 卡号 = :cardId");
    query.bindValue(":fee", fee);
    query.bindValue(":cardId", card);

    if (!query.exec()) {
        qDebug() << "扣费执行失败" ;
    } else {
        qDebug() << "成功扣费" << fee << "元，卡号：" << card;
    }
}

/*=======================================================================================================================
                                           页面三更新
=========================================================================================================================*/

//更新页面三信息
void menu::show_money(QString card)
{
   ui->lineEdit->setText(card);
   QSqlQuery query(db_incar); // 绑定正确的数据库连接
   query.prepare("SELECT 余额 FROM card WHERE 卡号 = :card");
   query.bindValue(":card", card);
   if (query.exec()) {
       if(query.next()) {
           int money = query.value("余额").toInt();   //获取余额
           qDebug() << money;
           ui->label_4->setText(QString::number(money));
       }
   } else {
       qDebug() << "查询余额失败" ;
   }
   updateTableWidget();
}

// 查询指定卡号且费用不为0的记录
QList<QList<QString>> menu::queryCardExpenses(QString card)
{
    QList<QList<QString>> result;
    if (!db_totalcar.isOpen()) {
        qDebug() << "数据库未打开，无法查询消费信息";
        return result;
    }
    QString selectSql = "SELECT 车牌, 卡号, 时间, 费用 FROM totalcar WHERE 卡号 = :card AND 费用 != 0";
    QSqlQuery query(db_totalcar);
    query.prepare(selectSql);
    query.bindValue(":card", card);
    if (query.exec()) {
        while (query.next()) {
            QList<QString> rowData;
            for (int i = 0; i < 4; ++i) {
                rowData << query.value(i).toString();
            }
            result.append(rowData);
        }
    } else {
        qDebug() << "查询消费信息失败" ;
    }
    return result;
}

// 更新消费记录显示
void menu::updateTableWidget()
{
    QString cardStr = ui->lineEdit->text();
    QString card = cardStr;
    QList<QList<QString>> data = queryCardExpenses(card);

    // 清空表格
    ui->tableWidget->clear();
    // 隐藏行列头标题栏
    ui->tableWidget->verticalHeader()->setVisible(false);
    ui->tableWidget->horizontalHeader()->setVisible(false);

    // 设置列数和行数
    int columnCount = 4;
    int rowCount = data.size();
    ui->tableWidget->setColumnCount(columnCount);
    ui->tableWidget->setRowCount(rowCount);

    // 填充数据
    for (int row = 0; row < rowCount; ++row) {
        for (int col = 0; col < columnCount; ++col) {
            QTableWidgetItem *item = new QTableWidgetItem(data[row][col]);
            item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
            ui->tableWidget->setItem(row, col, item);
        }
    }
    // 自适应列宽
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}

//充值事件
void menu::on_lineEdit_3_returnPressed()
{

    QString card = ui->lineEdit->text().trimmed(); // 去除空格，避免空值
        QString numStr = ui->lineEdit_3->text().trimmed();
        // 卡号/金额不能为空
        if (card.isEmpty() || numStr.isEmpty()) {
            QMessageBox::warning(this, tr("警告"), tr("卡号或充值金额不能为空！"));
            return;
        }
        bool isNum;
        // 金额必须是正整数
        int num = numStr.toInt(&isNum);
        if (!isNum || num <= 0) {
            QMessageBox::warning(this, tr("警告"), tr("请输入有效的充值金额！"));
            ui->lineEdit_3->clear(); // 清空错误输入
            return;
        }

        // 2. 查询当前余额（先确认卡号存在）
        QSqlQuery query(db_incar); // 绑定db_incar连接
        query.prepare("SELECT 余额 FROM card WHERE 卡号 = :card");
        query.bindValue(":card", card);
        // 执行查询失败
        if (!query.exec()) {
            QMessageBox::critical(this, tr("错误"), tr("查询余额失败，请检查数据库！"));
            return;
        }
        // 无匹配卡号（卡号不存在）
        if (!query.next()) {
            QMessageBox::warning(this, tr("警告"), tr("卡号【%1】不存在，请重新输入！").arg(card));
            ui->lineEdit->clear(); // 清空错误卡号
            ui->lineEdit_3->clear();
            return;
        }

        // 3. 计算新余额并更新数据库
            int oldMoney = query.value("余额").toInt(); // 获取旧余额
            int newMoney = oldMoney + num; // 计算新余额

            // 预处理更新语句（使用updateQuery，而非query_incar）
            QSqlQuery updateQuery(db_incar);
            updateQuery.prepare("UPDATE card SET 余额 = :newMoney WHERE 卡号 = :card");
            updateQuery.bindValue(":newMoney", newMoney);
            updateQuery.bindValue(":card", card);

            // 执行更新并判断结果
            if (updateQuery.exec()) {
                show_money(card); // 从数据库读取新余额，更新label_4
                ui->lineEdit_3->clear(); // 清空充值金额输入框
                QMessageBox::information(this, tr("提示"), tr("恭喜🎉\n充值成功！\n当前余额：%1元").arg(newMoney));
            } else {
                QMessageBox::critical(this, tr("错误"), tr("充值失败，请重试！"));
            }

}

//搜索信息
void menu::on_search_btn_clicked()
{
    if(ui->search_edit->text().isEmpty())
    {
        refreshTotalTable();
        return;
    }
    QString mes = ui->search_edit->text();

        QString sql = QString("SELECT 车牌, 卡号, 时间, 费用 FROM totalcar WHERE 车牌 LIKE '%%1%' OR 卡号 LIKE '%%1%' OR 时间 LIKE '%%1%'")
                      .arg(mes);

        // 2. 执行查询
        if (!query_totalcar.exec(sql)) {
            QMessageBox::critical(this, tr("warm!!!"), tr("请输入查询失败!"));
            return;
        }

        // 3. 清空并初始化表格
        ui->total_table->clear();
        ui->total_table->setColumnCount(4);  // 设置列数（车牌、卡号、时间、费用）
        ui->total_table->setHorizontalHeaderLabels(QStringList() << "车牌" << "卡号" << "时间" << "费用");

        // 4. 填充表格数据
        int row = 0;
        while (query_totalcar.next()) {
            ui->total_table->setRowCount(row + 1);  // 动态增加行数
            for (int col = 0; col < 4; ++col) {
                QTableWidgetItem *item = new QTableWidgetItem(query_totalcar.value(col).toString());
                item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                ui->total_table->setItem(row, col, item);
            }
            row++;
        }

        // 5. 自适应列宽
        ui->total_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}

//回车查询金额
void menu::on_lineEdit_returnPressed()
{
    QString card_id = ui->lineEdit->text().trimmed();
    if (card_id.isEmpty()) {
        ui->label_4->setText("请输入卡号");
        return;
    }

    // 检查数据库连接
    if (!db_incar.isOpen()) {
        if (!db_incar.open()) {
            qDebug() << "无法打开数据库连接:";
            ui->label_4->setText("数据库连接失败");
            return;
        }
    }

    QSqlQuery query(db_incar);
    query.prepare("SELECT 余额 FROM card WHERE 卡号 = :card");
    query.bindValue(":card", card_id);

    // 执行查询
    if (query.exec()) {
        if (query.next()) {
            int money = query.value(0).toInt();
            qDebug() << "卡号" << card_id << "的余额:" << money;
            ui->label_4->setText(QString::number(money));
        } else {
            qDebug() << "未找到卡号" << card_id << "对应的记录";
            ui->label_4->setText("卡号不存在");
        }
    } else {
        qDebug() << "查询执行失败:" ;
        ui->label_4->setText("查询失败");
    }
}

//f5刷新
void menu::onF5Pressed()
{
    stay_time();
    refreshInTable();
    refreshTotalTable();
}
